xcb 获取事件

获取窗口事件

1// 获取窗口事件
2#include <stdio.h>
3#include <xcb/xcb.h>
4
5int main()
6{
7    // 连接到X11 Server
8    xcb_connection_t* conn = xcb_connect(NULL, NULL);
9
10    // 获取screen
11    const xcb_setup_t* setup = xcb_get_setup(conn);
12    xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
13    xcb_screen_t* screen = iter.data;
14
15    // 创建窗口
16    xcb_window_t window = xcb_generate_id(conn);
17    uint32_t mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18    uint32_t values[2];
19    values[0] = screen->white_pixel;
20    values[1] = XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE;
21
22    xcb_create_window(conn, XCB_COPY_FROM_PARENT, window, screen->root, 
23                        0, 0, 500, 500, 10, XCB_WINDOW_CLASS_INPUT_OUTPUT, 
24                        screen->root_visual, mask, values);
25
26    xcb_map_window(conn, window);
27    xcb_flush(conn);
28
29    // 读取事件
30    xcb_generic_event_t* event;
31    while((event = xcb_wait_for_event(conn))) {
32        if(event->response_type == XCB_KEY_PRESS)
33        {
34            xcb_key_press_event_t *press = (xcb_key_press_event_t*)event;
35            printf("press %d\n", press->detail);
36        }
37        
38        if(event->response_type == XCB_KEY_RELEASE)
39        {
40            xcb_key_press_event_t *press = (xcb_key_press_event_t*)event;
41            printf("release %d\n", press->detail);
42        }
43    }
44
45    xcb_disconnect(conn);
46}

获取全局事件

1// 获取全局事件
2#include <stdio.h>
3#include <xcb/xcb.h>
4
5
6#define	ModMaskAlt          XCB_MOD_MASK_1
7#define ModMaskNumLock      XCB_MOD_MASK_2 
8#define ModMaskSuper        XCB_MOD_MASK_4 
9#define ModMaskModeSwitch   XCB_MOD_MASK_5
10#define ModMaskShift        XCB_MOD_MASK_SHIFT
11#define ModMaskCapsLock     XCB_MOD_MASK_LOCK
12#define ModMaskControl      XCB_MOD_MASK_CONTROL
13
14int main()
15{
16    // 连接到X11 Server
17    xcb_connection_t* conn = xcb_connect(NULL, NULL);
18
19    // 获取screen
20    const xcb_setup_t* setup = xcb_get_setup(conn);
21    xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
22    xcb_screen_t* screen = iter.data;
23
24    // 捕获快捷键
25    xcb_grab_key(conn, 1, screen->root,
26                ModMaskControl, 46, // Ctrl + L
27                XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
28    xcb_grab_key(conn, 1, screen->root,
29                ModMaskControl | ModMaskCapsLock, 46, // Ctrl + L with CapsLock
30                XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
31    xcb_grab_key(conn, 1, screen->root,
32                ModMaskControl | ModMaskNumLock, 46, // Ctrl + L with NumLock
33                XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
34    xcb_grab_key(conn, 1, screen->root,
35                ModMaskControl | ModMaskCapsLock | ModMaskNumLock, 46, // Ctrl + L with CapsLock and NumLock
36                XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
37    xcb_flush(conn);
38
39    // 读取事件
40    xcb_generic_event_t* event;
41    while((event = xcb_wait_for_event(conn))) {
42        if(event->response_type == XCB_KEY_PRESS)
43        {
44            xcb_key_press_event_t *press = (xcb_key_press_event_t*)event;
45            printf("press %d\n", press->detail);
46        }
47
48        if(event->response_type == XCB_KEY_RELEASE)
49        {
50            xcb_key_press_event_t *press = (xcb_key_press_event_t*)event;
51            printf("release %d\n", press->detail);
52        }
53    }
54
55    xcb_disconnect(conn);
56}